package main
import (
	"fmt";
	"errors"
)

func func1(){
	//自执行匿名函数
	fmt.Println("开始")
	defer func(){
		fmt.Println("aaa")
		fmt.Println("bbb")
	}()
	fmt.Println("结束")
}


func func2()int{
	a:=1
	defer func(){a++}()
	return a
}

//对于命名返回值  需要执行延迟返回值的内存才返回
func func3()(a int){
	defer func(){a++}()
	return a
}


func calc(str string,a,b int)int{
	ret:=a+b
	fmt.Printf("str=%s a=%d b=%d ret=%d\n",str,a,b,ret)
	return ret
}
func func4()(a int){
	a=10
	defer func(a int){
		a++
	}(a)
	return a
}


func func5(a,b int){
	//panic("get a error")
	//监听异常
	defer func(){
		err:=recover()
		if err!=nil{
				fmt.Println(err)
		}
	}()
	fmt.Println(a/b)
}

func readFile(fileName string)error{
	if fileName=="main.go"{
		return nil
	}else{
		return errors.New("file error")
	}
}
func func6(){
	defer func(){
		err:=recover()
		fmt.Println(err)
	}()
	err:=readFile("xxx.go")
	if err!=nil{
		panic("open error")
	}
}
func main(){
	//defer的用法  defer的内容程序结束  才执行
	fmt.Println("开始")
	defer fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
	fmt.Println("结束")
	fmt.Println(20+30)

	func1()
	ret:=func2()
	fmt.Printf("ret=%d\n",ret)
	//defer 延迟执行
	fmt.Printf("func3=%d\n",func3())

	a:=1
	b:=2
	//传参的顺序是正常的
	//执行的顺序相反
	defer calc("abcd",a,calc("ss",a,b))
	a=10
	defer calc("dfg",a,calc("tty",a,b))

	func5(10,0)
	func6()
}